/**
 * 加速特效片元着色器
 * 生成动态的速度线效果（类似极品飞车）
 * 使用 Simplex 噪声生成随机条纹，颜色噪声添加彩色变化
 */

// 引入外部 GLSL 库
#include "/node_modules/furina/generative/simplex.glsl"  // Simplex 噪声
#include "/node_modules/lygia/generative/random.glsl"   // 随机数生成
#include "/node_modules/lygia/math/saturate.glsl"       // 限制到 [0,1]
#include "/node_modules/lygia/math/map.glsl"            // 值域映射
#include "/node_modules/lygia/color/palette.glsl"       // 颜色调色板

// Shadertoy 风格的 uniform
uniform float iTime;        // 经过的时间
uniform vec3 iResolution;   // 视口分辨率
uniform vec4 iMouse;        // 鼠标位置

// 从顶点着色器传入的变量
varying vec2 vUv;           // UV 纹理坐标

// 自定义 uniform
uniform float uSpeed;       // 当前速度（控制显示强度）
uniform float uOpacity;     // 整体透明度

/**
 * 位置转颜色
 * 根据 2D 位置生成随机颜色
 * @param i - 2D 位置坐标
 * @return 随机 RGB 颜色
 */
vec3 pos2col(vec2 i){
    // 添加偏移避免重复
    i+=vec2(9.,0.);
    
    // 为每个通道生成不同的随机值
    float r=random(i+vec2(12.,2.));
    float g=random(i+vec2(7.,5.));
    float b=random(i);
    
    // 组合为颜色
    vec3 col=vec3(r,g,b);
    return col;
}

/**
 * 颜色噪声
 * 生成平滑的彩色噪声（双线性插值）
 * @param uv - 纹理坐标
 * @return 平滑的随机颜色
 */
vec3 colorNoise(vec2 uv){
    // 设置网格尺寸
    vec2 size=vec2(1.);
    vec2 pc=uv*size;
    vec2 base=floor(pc); // 网格基坐标
    
    // 获取四个角点的颜色
    vec3 v1=pos2col((base+vec2(0.,0.))/size); // 左下
    vec3 v2=pos2col((base+vec2(1.,0.))/size); // 右下
    vec3 v3=pos2col((base+vec2(0.,1.))/size); // 左上
    vec3 v4=pos2col((base+vec2(1.,1.))/size); // 右上
    
    // 计算网格内的分数部分
    vec2 f=fract(pc);
    
    // 使用 smoothstep 平滑插值
    f=smoothstep(0.,1.,f);
    
    // 双线性插值：先 X 方向，再 Y 方向
    vec3 px1=mix(v1,v2,f.x); // 底边插值
    vec3 px2=mix(v3,v4,f.x); // 顶边插值
    vec3 v=mix(px1,px2,f.y); // 最终插值
    return v;
}

void main(){
    // 获取 UV 坐标
    vec2 uv=vUv;
    
    // 初始化颜色（白色）
    vec3 col=vec3(1.);
    
    // 初始化遮罩（控制透明度）
    float mask=1.;
    
    // ==================== 1. 生成速度线条纹 ====================
    // 创建流动的 UV（沿 X 轴向左流动）
    vec2 noiseUv=uv;
    noiseUv.x+=-iTime*.5; // 向左流动
    
    // 使用 Simplex 噪声生成条纹
    // X 方向拉伸 3 倍，Y 方向拉伸 100 倍（生成竖条纹）
    float noiseValue=noise(noiseUv*vec2(3.,100.));
    mask=noiseValue;
    
    // 将噪声从 [-1,1] 映射到 [0,1]
    mask=map(mask,-1.,1.,0.,1.);
    // 增强对比度：减去 0.1 后取 11 次方
    mask=pow(saturate(mask-.1),11.);
    // 平滑边缘
    mask=smoothstep(0.,.04,mask);
    
    // ==================== 2. 应用彩色噪声 ====================
    // col=palette(mask,vec3(.5),vec3(.5),vec3(1.),vec3(0.,.33,.67)); // 可选：调色板
    // 生成彩色噪声（X 方向 10 倍，Y 方向 100 倍）
    col=colorNoise(noiseUv*vec2(10.,100.));
    // 调整颜色通道（R=1.5x, G=1x, B=400x -> 蓝色为主）
    col*=vec3(1.5,1.,400.);
    
    // ==================== 3. 应用边缘衰减和速度控制 ====================
    // 左右边缘淡出（避免硬边）
    mask*=smoothstep(.02,.5,uv.x)*smoothstep(.02,.5,1.-uv.x);
    // 上下边缘淡出
    mask*=smoothstep(.01,.1,uv.y)*smoothstep(.01,.1,1.-uv.y);
    // 根据速度控制显示（速度 1-10 时逐渐显示）
    mask*=smoothstep(1.,10.,uSpeed);
    
    // ==================== 4. 输出最终颜色 ====================
    // RGB = 彩色噪声，A = 遮罩 × 整体透明度
    gl_FragColor=vec4(col,mask*uOpacity);
}